<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
    <meta name="keywords" content="hexo, autumn" />
    <title>
        iOS开发
    </title>
    <!-- favicon -->
    
    <link rel="icon" href="https://cdn.jsdelivr.net/gh/frontendsophie/hexo-theme-autumn@1.0.0/source/img/favicon.ico" />
     <link rel="stylesheet" href="/blog/css/style.css">

    <!-- highlight -->
    <link rel="stylesheet" href="https://cdn.bootcss.com/highlight.js/9.12.0/styles/github-gist.min.css" />
    <script src="//cdn.bootcss.com/highlight.js/9.2.0/highlight.min.js"></script>
    <script>
        hljs.initHighlightingOnLoad()
    </script>
    <script src="https://cdn.jsdelivr.net/gh/frontendsophie/hexo-infinite-scroll@2.0.0/dist/main.js"></script>

    <script>
        infiniteScroll()

        window.addEventListener('DOMContentLoaded', function () {
            const [
                mainTitle,
                mobileMenu,
                mobileMainTitle,
                mobileMenuBtn,
                ipadMenuBtn,
                aside,
                closeBtn,
            ] = getEle(
                '#main-title',
                '.mobile-menu',
                '.mobile-menu h3',
                '.mobile-menu button',
                '.ipad-menu',
                'aside',
                'aside .close',
            )
            const io = new IntersectionObserver(entries => {
                if (entries[0].intersectionRatio <= 0) {
                    mobileMainTitle.classList.remove('invisibile')
                } else {
                    mobileMainTitle.classList.add('invisibile')
                }
            })
            io.observe(mainTitle)

            clickToggleAside(mobileMenuBtn)
            clickToggleAside(ipadMenuBtn)
            clickToggleAside(closeBtn, false)

            const isMenuVisible = window.getComputedStyle(mobileMenu).display !== 'none'
            if (isMenuVisible) document.body.style.background = 'none'

            function getEle(...args) {
                return args.map(arg => document.querySelector(arg))
            }

            function clickToggleAside(btn, show = true) {
                btn.addEventListener('click', function () {
                    if (show) {
                        aside.style.display = 'block'
                    } else {
                        aside.style.display = 'none'
                    }
                })
            }
        })
    </script>
</head>

<body style="background: url(https://cdn.jsdelivr.net/gh/frontendsophie/hexo-theme-autumn@1.0.0/source/img/button-bg.png) #f3f3f3">
    <div class="container">
        <header class="header">
    <nav class="mobile-menu" style="background: url(https://cdn.jsdelivr.net/gh/frontendsophie/hexo-theme-autumn@1.0.0/source/img/button-bg.png) #f3f3f3">
        <h3 class="invisibile">
            <a href="/blog/" class="logo">
                iOS开发
            </a>
        </h3>
        <button class="menu">menu</button>
    </nav>

    <button class="ipad-menu menu">menu</button>

    <h1 class="title" id="main-title">
        <a href="/blog/" class="logo">
            iOS开发
        </a>
    </h1>
    <h2 class="desc">
        
    </h2>

    <div class="links">
        <ul>
            
            <li>
                <a href="https://github.com/FrontendSophie" target="_blank" rel="noopener">
                    Github
                </a>
            </li>
            
            <li>
                <a href="https://www.linkedin.com/in/frontendsophie/" target="_blank" rel="noopener">
                    LinkedIn
                </a>
            </li>
            
        </ul>
    </div>
</header>
        <main class="main">
            <article class="post">
    
    
    
    <h2 class="post-title">
        iOS Swift 类（class）和结构体（struct）的区别
    </h2>
    <ul class="post-date">
        <li>
            2020-03-02
        </li>
        <li>
            selinaSun
        </li>
    </ul>
    <div class="post-content">
        <h3 id="1-首要区别是类型不同！-在Swift中，类是引用类型，结构体是值类型。"><a href="#1-首要区别是类型不同！-在Swift中，类是引用类型，结构体是值类型。" class="headerlink" title="1.首要区别是类型不同！ 在Swift中，类是引用类型，结构体是值类型。"></a>1.首要区别是类型不同！ 在Swift中，类是引用类型，结构体是值类型。</h3><h3 id="值类型（Value-types）在传递和赋值时会进行copy-一般以结构体-struct-、-枚举-enum-或者元组-tuple-的形式出现。"><a href="#值类型（Value-types）在传递和赋值时会进行copy-一般以结构体-struct-、-枚举-enum-或者元组-tuple-的形式出现。" class="headerlink" title="值类型（Value types）在传递和赋值时会进行copy( 一般以结构体 (struct) 、 枚举(enum) 或者元组(tuple)的形式出现。)"></a>值类型（Value types）在传递和赋值时会进行copy( 一般以结构体 (struct) 、 枚举(enum) 或者元组(tuple)的形式出现。)</h3><h3 id="引用类型是每个实例指向同一个数据源-（以类-class-的形式出现）"><a href="#引用类型是每个实例指向同一个数据源-（以类-class-的形式出现）" class="headerlink" title="引用类型是每个实例指向同一个数据源 （以类(class)的形式出现）"></a>引用类型是每个实例指向同一个数据源 （以类(class)的形式出现）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">class Person &#123;</span><br><span class="line">    var name: String</span><br><span class="line">    init(name: String) &#123;</span><br><span class="line">        self.name = name</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">var var1 = Person(name: <span class="string">"Sam"</span>)</span><br><span class="line">var var2 = var1</span><br></pre></td></tr></table></figure>
<h3 id="此时若修改var2的name，var1也会跟着变"><a href="#此时若修改var2的name，var1也会跟着变" class="headerlink" title="此时若修改var2的name，var1也会跟着变"></a>此时若修改var2的name，var1也会跟着变</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">struct Person &#123;</span><br><span class="line">    var name: String</span><br><span class="line">&#125;</span><br><span class="line">var var1 = Person(name: &quot;Sam&quot;)</span><br><span class="line">var var2 = var1</span><br></pre></td></tr></table></figure>
<h3 id="此时，系统将会创建一个新的实例var2并将var1中的值copy一份。当修改var1中的属性时，var2的值是不会发生改变的"><a href="#此时，系统将会创建一个新的实例var2并将var1中的值copy一份。当修改var1中的属性时，var2的值是不会发生改变的" class="headerlink" title="此时，系统将会创建一个新的实例var2并将var1中的值copy一份。当修改var1中的属性时，var2的值是不会发生改变的"></a>此时，系统将会创建一个新的实例var2并将var1中的值copy一份。当修改var1中的属性时，var2的值是不会发生改变的</h3><h3 id="2-堆-heap-amp-栈-stack"><a href="#2-堆-heap-amp-栈-stack" class="headerlink" title="2.堆(heap) &amp; 栈(stack)"></a>2.堆(heap) &amp; 栈(stack)</h3><h4 id="内存中，引用类型诸如类是在堆（heap）上，而值类型诸如结构体实在栈（stack）上进行存储和操作。"><a href="#内存中，引用类型诸如类是在堆（heap）上，而值类型诸如结构体实在栈（stack）上进行存储和操作。" class="headerlink" title="内存中，引用类型诸如类是在堆（heap）上，而值类型诸如结构体实在栈（stack）上进行存储和操作。"></a>内存中，引用类型诸如类是在堆（heap）上，而值类型诸如结构体实在栈（stack）上进行存储和操作。</h4><h3 id="class有这几个功能struct没有的"><a href="#class有这几个功能struct没有的" class="headerlink" title="class有这几个功能struct没有的"></a>class有这几个功能struct没有的</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">类型转换可以在runtime的时候检查和解释一个实例的类型</span><br><span class="line">可以用deinit来释放资源</span><br><span class="line">一个类可以被多次引用</span><br></pre></td></tr></table></figure>

<h3 id="struct也有这样几个优势"><a href="#struct也有这样几个优势" class="headerlink" title="struct也有这样几个优势"></a>struct也有这样几个优势</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">无须担心内存memory leak或者多线程冲突问题</span><br></pre></td></tr></table></figure>
<h3 id="今天面试被问及了这个问题，事后总结一下，也巩固一下记忆。"><a href="#今天面试被问及了这个问题，事后总结一下，也巩固一下记忆。" class="headerlink" title="今天面试被问及了这个问题，事后总结一下，也巩固一下记忆。"></a>今天面试被问及了这个问题，事后总结一下，也巩固一下记忆。</h3>
    </div>
</article>
        </main>
        <aside class="aside">
            <div class="close"></div>
            <section class="aside-section">
                
    <h1>Categories</h1>

    

            </section>
            <section class="aside-section">
                
    <h1>Archives</h1>

    <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2020/">2020</a></li><li class="archive-list-item"><a class="archive-list-link" href="/blog/archives/2019/">2019</a></li></ul>


            </section>
            <section class="aside-section tag">
                
    <h1>Tags</h1>

    

            </section>
        </aside>
    </div>
</body>

</html>